嗨嗨!今天想來了解的是 Laravel Middleware ,這在 Laravel 中做什麼呢?為什麼需要這個東東~
先來看看官方網站怎麼說的勒
Introduction
Middleware provide a convenient mechanism for inspecting and
filtering HTTP requests entering your application. For example, Laravel
includes a middleware that verifies the user of your application is
authenticated. If the user is not authenticated, the middleware will
redirect the user to your application's login screen. However, if the
user is authenticated, the middleware will allow the request to proceed
further into the application.Additional middleware can be written to perform a variety of tasks
besides authentication. For example, a logging middleware might log all
incoming requests to your application. A variety of middleware are
included in Laravel, including middleware for authentication and CSRF
protection; however, all user-defined middleware are typically located
in your application'sapp/Http/Middleware
directory.
我理解的意思大概是,Middleware (中介軟體)就像是應用程式的檢查站,負責篩選進入的 HTTP 請求。像是 Laravel 有一個 Middleware (中介軟體)專門檢查使用者的身份。如果使用者還沒通過身份驗證,Middleware (中介軟體)會將畫面引導到登錄頁面;但如果使用者已經登入了,就會讓請求繼續進入應用程式。
當然,Middleware (中介軟體)可以做身份驗證, 還可以做其他事情。像是,有一種日誌 Middleware (中介軟體),它會記錄所有進入的請求,這樣就能隨時查看誰進來過。Laravel 包含了多種 Middleware (中介軟體),不僅限於身份驗證,還有一些用來防止 CSRF 攻擊的功能。我們自己創建的 Middleware (中介軟體),通常會放在應用程式的 app/Http/Middleware
資料夾裡。
handle()
方法,我們可以選擇處理請求或返回回應。要創建一個新的 Middleware,使用 Artisan 命令中的 make:middleware
指令:
php artisan make:middleware CheckAge
會在 app/Http/Middleware
目錄下創建 CheckAge.php
的檔案。
檔案中,我們可以寫上檢查年齡的需求
<?php
namespace App\\Http\\Middleware;
use Closure;
class CheckAge
{
public function handle(Request $request, Closure $next): Response
{
// 假設我們從請求中獲取年齡
if ($request->age < 18) {
// 若年齡小於 18,重定向到 home 頁面
return redirect('home');
}
// 如果年齡符合要求,則繼續請求
return $next($request);
}
}
如果希望 Middleware 在每個 HTTP 請求期間都運行,可以在 bootstrap/app.php
文件中使用 withMiddleware
方法來註冊:
use App\Http\Middleware\CheckAge;
$app->withMiddleware(function (Middleware $middleware) {
$middleware->append(CheckAge::class);
});
prepend
方法註冊與 append
方法註冊假設我們有三個Middleware A、B 和 C,我們可以這樣使用 prepend()
和 append()
方法來控制它們的運行順序:
prepend()
方法註冊,這樣它會放在最前面運行。append()
方法註冊,這樣它會放在最後面運行。這樣的運行順序會是:
Middleware A(最先運行)→ Middleware B(其次運行)→ Middleware C(最後運行)
如果你有多個 Middleware 想一起使用,可以將它們分組。
在 bootstrap/app.php
中使用 withMiddleware
方法來註冊 Global Middleware,並使用 appendToGroup
方法將 Middleware 添加到已存在的群組中。
use App\Http\Middleware\CheckAge;
use App\Http\Middleware\First;
use App\Http\Middleware\Second;
$app->withMiddleware(function (Illuminate\Foundation\Http\Middleware $middleware) {
// 將 CheckAge 中介軟體添加到 web 群組
$middleware->appendToGroup('web', [
CheckAge::class,
]);
// 將多個中介軟體添加到 group-name 群組
$middleware->appendToGroup('group-name', [
First::class,
Second::class,
]);
});
將 Middleware 指派給特定 routes ,可以使用 middleware()
方法:
Route::get('/profile', function () {
// ...
})->middleware('checkAge');
參考資料:
踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!
教皇:多與人討論、詢問,都是能通往更好的道路唷!
"Everyone falls down. Getting back up is how you learn how to walk."
每個人都會跌倒,但重新振起來是學習繼續向前的方式。
Walt Disney